package bz.ziro.kanbe.controller;

import java.util.Date;

import org.slim3.controller.Navigation;
import org.slim3.datastore.Datastore;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.repackaged.com.google.common.base.StringUtil;

import bz.ziro.kanbe.dao.CommentDao;
import bz.ziro.kanbe.logic.HtmlLogic;
import bz.ziro.kanbe.logic.MailLogic;
import bz.ziro.kanbe.model.Comment;
import bz.ziro.kanbe.model.CommentConfig;
import bz.ziro.kanbe.model.Page;
import bz.ziro.kanbe.model.Site;
import bz.ziro.kanbe.util.KeyFactory;

/**
 * コメント追加コントローラー
 * @author Administrator
 */
public class CommentController extends PostController {

    @Override
    public void post(Site site,Page page,Navigation navi) {

    	Key pageKey = page.getKey();
    	//ページのテンプレートから設定を取り出す
    	CommentConfig config = CommentDao.findConfig(page.getPageTemplateKey());
    	if ( config == null ) {
    		config = new CommentConfig();
    	}

    	//各送信値の取得
    	String commentName = requestScope("commentName");
    	String commentMail = requestScope("commentMail");
    	String comment = requestScope("comment");

    	//名称かメールアドレスが必須で存在しない、もしくはコメントが存在しない場合
    	if ( config.isNameFlag() && StringUtil.isEmpty(commentName) ||
    	 	 config.isMailFlag() && StringUtil.isEmpty(commentMail) ||
    	 	 StringUtil.isEmpty(comment)) {
    		return;
    	} else if ( config.isMailFlag() && !isMail(commentMail) ) {
    		return;
    	}
 
		Comment entity = new Comment();
		//承認ありだった場合
		if ( config.isApprovalFlag() ) {
			//承認してないことにする
			entity.setFlag(false);
		} else {
			//承認していることにする
			entity.setFlag(true);
		}
	
		//各データを設定
		entity.setName(commentName);
		entity.setMail(commentMail);
		entity.setComment(comment);

		//作成日を設定
		entity.setCreateDate(new Date());
		
		Key key = KeyFactory.allocateCommentKey();
		entity.setKey(key);
		//親のページキーを設定しておく
		entity.setOwnerPageKey(pageKey);

		Datastore.put(entity);
		//メール送信が設定されている場合
		if ( config.isSendMailFlag() ) {
			String path = HtmlLogic.getDomain(request) + navi.getPath();
			//コメントメールを送信
			MailLogic.sendCommentMail(path);
		}
        return;
    }

    /**
     * メールアドレス判定
     * @param str
     * @return
     */
    public static boolean isMail( String str ) {
    	if ( str == null ) return false;
    	return str.matches("[\\w\\.\\-]+@(?:[\\w\\-]+\\.)+[\\w\\-]+");
    }
}
